/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 * 
 * Copyright (c) 2008-2009, The KiWi Project (http://www.kiwi-project.eu)
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 * - Redistributions of source code must retain the above copyright notice, 
 *   this list of conditions and the following disclaimer.
 * - Redistributions in binary form must reproduce the above copyright notice, 
 *   this list of conditions and the following disclaimer in the documentation 
 *   and/or other materials provided with the distribution.
 * - Neither the name of the KiWi Project nor the names of its contributors 
 *   may be used to endorse or promote products derived from this software 
 *   without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 * POSSIBILITY OF SUCH DAMAGE.
 * 
 * Contributor(s):
 * 
 * 
 */
package kiwi.core.model.rdf;

import kiwi.core.model.Constants;
import kiwi.core.model.content.TextContent;
import kiwi.core.model.user.KiWiUser;
import org.hibernate.annotations.CacheConcurrencyStrategy;

import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.persistence.Transient;
import java.io.Serializable;
import java.util.Locale;


/**
 * Representation of textual content in the KiWi system. Backed by an XML document represented 
 * in XOM format.
 *
 * TODO: there should be a way to check validity of the XML document, particularly 
 * regarding the bookmarks for text fragments.
 * 
 * @author Sebastian Schaffert
 */
@Entity
@DiscriminatorValue("TEXTCONTENT")
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class KiWiTextContentLiteral extends KiWiStringLiteral implements Serializable {

	private static final long serialVersionUID = 2742586720018796723L;


    // transient; used for caching purposes
    @Transient
    private TextContent textContent;


    public KiWiTextContentLiteral() {
        super();
        setType(Constants.NS_KIWI_CORE + "TextContent");
    }

    public KiWiTextContentLiteral(KiWiUser creator) {
        super(creator);
        setType(Constants.NS_KIWI_CORE + "TextContent");
    }

    public KiWiTextContentLiteral(String content) {
        super(content, Locale.getDefault(), Constants.NS_KIWI_CORE + "TextContent");
     }

    public KiWiTextContentLiteral(String content, Locale language) {
        super(content, language, Constants.NS_KIWI_CORE + "TextContent");
    }

    public TextContent getTextContent() {
        if(textContent == null) {
            textContent = new TextContent(getContent(), getLanguage());
        }
        return textContent;
    }

    public void setTextContent(TextContent textContent) {
        this.textContent = textContent;
        setContent(textContent.getXmlString());
        setLanguage(textContent.getLang());
    }

    /**
     * Set the content of the literal to the content provided as parameter.
     *
     * @param content
     */
    @Override
    public void setContent(String content) {
        if(textContent != null) {
            textContent.setXmlString(content);
        }
        super.setContent(content);
    }


    /**
     * Set the language of this literal to the given locale.
     *
     * @param language
     */
    @Override
    public void setLanguage(Locale language) {
        if(textContent != null) {
            textContent.setLang(language);
        }
        super.setLanguage(language);
    }
}
